/**
 * 应用配置模块
 * 统一管理环境变量和配置项
 */

import dotenv from 'dotenv'
import path from 'path'

// 加载环境变量
dotenv.config({ path: path.resolve(process.cwd(), '.env') })

/**
 * 获取环境变量，如果不存在则抛出错误
 */
function getEnvOrThrow(key: string): string {
    const value = process.env[key]
    if (!value) {
        throw new Error(`环境变量 ${key} 未设置！请在 .env 文件中配置。`)
    }
    return value
}

/**
 * 获取环境变量，如果不存在则返回默认值
 */
function getEnvOrDefault(key: string, defaultValue: string): string {
    return process.env[key] || defaultValue
}

/**
 * 获取布尔类型的环境变量
 */
function getBooleanEnv(key: string, defaultValue: boolean = false): boolean {
    const value = process.env[key]
    if (!value) return defaultValue
    return value.toLowerCase() === 'true' || value === '1'
}

/**
 * 获取数字类型的环境变量
 */
function getNumberEnv(key: string, defaultValue: number): number {
    const value = process.env[key]
    if (!value) return defaultValue
    const parsed = parseInt(value, 10)
    return isNaN(parsed) ? defaultValue : parsed
}

/**
 * 应用配置对象
 */
export const config = {
    // 数据库配置
    database: {
        url: getEnvOrThrow('DATABASE_URL')
    },

    // Redis 配置
    redis: {
        host: getEnvOrDefault('REDIS_HOST', 'localhost'),
        port: getNumberEnv('REDIS_PORT', 6379),
        password: process.env.REDIS_PASSWORD || undefined,
        db: getNumberEnv('REDIS_DB', 0)
    },

    // JWT 配置
    jwt: {
        secret: getEnvOrThrow('JWT_SECRET'),
        expiresIn: getEnvOrDefault('JWT_EXPIRES_IN', '7d'),
        refreshExpiresIn: getEnvOrDefault('JWT_REFRESH_EXPIRES_IN', '30d')
    },

    // 服务器配置
    server: {
        port: getNumberEnv('PORT', 3000),
        host: getEnvOrDefault('HOST', '0.0.0.0'),
        env: getEnvOrDefault('NODE_ENV', 'development')
    },

    // CORS 配置
    cors: {
        origin: getEnvOrDefault('CORS_ORIGIN', 'http://localhost:5173'),
        credentials: true
    },

    // AWS S3 配置
    s3: {
        region: getEnvOrDefault('AWS_REGION', 'us-east-1'),
        accessKeyId: process.env.AWS_ACCESS_KEY_ID,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
        bucket: getEnvOrDefault('S3_BUCKET', 'checkin-uploads'),
        endpoint: process.env.S3_ENDPOINT,
        forcePathStyle: getBooleanEnv('S3_FORCE_PATH_STYLE', false),
        publicUrl: process.env.S3_PUBLIC_URL
    },

    // 日志配置
    logger: {
        level: getEnvOrDefault('LOG_LEVEL', 'info')
    },

    // 签到码配置
    secretCode: {
        length: getNumberEnv('SECRET_CODE_LENGTH', 6),
        expiresIn: getNumberEnv('SECRET_CODE_EXPIRES_IN', 300) // 默认 5 分钟
    },

    // 文件上传配置
    upload: {
        maxFileSize: getNumberEnv('MAX_FILE_SIZE', 5 * 1024 * 1024) // 默认 5MB
    },

    // 微信配置
    wechat: {
        appId: process.env.WECHAT_APP_ID,
        appSecret: process.env.WECHAT_APP_SECRET
    },

    // 测试配置
    test: {
        databaseUrl: process.env.TEST_DATABASE_URL
    }
} as const

/**
 * 验证必需的环境变量
 * 在应用启动时调用
 */
export function validateConfig(): void {
    try {
        // 验证必需的配置
        getEnvOrThrow('DATABASE_URL')
        getEnvOrThrow('JWT_SECRET')

        // JWT 密钥长度验证（安全要求）
        if (config.jwt.secret.length < 32) {
            throw new Error('JWT_SECRET 长度必须至少 32 个字符！')
        }

        // 生产环境额外验证
        if (config.server.env === 'production') {
            // 生产环境不允许使用默认密钥
            if (config.jwt.secret.includes('change-in-production')) {
                throw new Error('生产环境必须修改默认的 JWT_SECRET！')
            }

            // 生产环境建议配置 S3
            if (!config.s3.accessKeyId || !config.s3.secretAccessKey) {
                console.warn('⚠️  警告：生产环境未配置 AWS S3 凭证，文件上传功能可能无法使用')
            }
        }

        console.log('✅ 配置验证通过')
    } catch (error) {
        console.error('❌ 配置验证失败:', error instanceof Error ? error.message : error)
        throw error
    }
}

/**
 * 打印配置信息（敏感信息会被隐藏）
 */
export function printConfig(): void {
    const maskSecret = (secret?: string) => {
        if (!secret) return 'undefined'
        if (secret.length <= 8) return '***'
        return `${secret.substring(0, 4)}...${secret.substring(secret.length - 4)}`
    }

    console.log('\n📋 当前配置:')
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
    console.log(`环境:           ${config.server.env}`)
    console.log(`服务器:         ${config.server.host}:${config.server.port}`)
    console.log(`数据库:         ${config.database.url.split('@')[1] || 'localhost'}`)
    console.log(`Redis:          ${config.redis.host}:${config.redis.port}`)
    console.log(`JWT Secret:     ${maskSecret(config.jwt.secret)}`)
    console.log(`JWT 过期时间:   ${config.jwt.expiresIn}`)
    console.log(`CORS Origin:    ${config.cors.origin}`)
    console.log(`日志级别:       ${config.logger.level}`)
    console.log(`S3 Bucket:      ${config.s3.bucket}`)
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n')
}

/**
 * 判断是否为开发环境
 */
export function isDevelopment(): boolean {
    return config.server.env === 'development'
}

/**
 * 判断是否为生产环境
 */
export function isProduction(): boolean {
    return config.server.env === 'production'
}

/**
 * 判断是否为测试环境
 */
export function isTest(): boolean {
    return config.server.env === 'test'
}

export default config
